home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d13
/
nuf210.arc
/
ROOTPATH.C
< prev
next >
Wrap
C/C++ Source or Header
|
1990-06-14
|
4KB
|
102 lines
/*************************************************************************
* RootPath -- Convert a pathname argument to root based cannonical *
* form. *
* Author: Don A. Williams *
* CompuServ - *
* Genie - DON-WILL *
* *
* RootPath determines the current directory, appends the path argument *
* (which may affect which disk the current directory is relative to), *
* and qualifies "." and ".." references. The result is a complete, *
* simple, path name with drive specifier. *
* *
* If the relative path the user specifies does not include a drive *
* spec., the default drive will be used as the base. (The default drive *
* will never be changed.) *
* *
* entry: RelativePath -- pointer to the pathname to be expanded. *
* FullPath -- must point to a working buffer, see warning. *
* *
* exit: FullPath -- the full path which results. *
* *
* return: A pointer to FullPath if OK, NULL if an error occurs.
* *
* calls: getcurdir getdisk *
* *
* warning: FullPath must point to a working buffer large enough to *
* hold the longest possible relative path argument plus *
* the longest possible current directory path. *
* *
* RootPath was modeled after the public domain file "rootpath.c" with *
* fairly extensive "enhancement". The major enhancement is provision *
* for relative paths such as "..\..\here" which MS-DOS does NOT *
* support. I found that such a construct would be very handy in *
* several of my uses of UFIND so I added it. Provision has also been *
* made to handle either of the two element name separator characters; *
* the '\' of MS-DOS or the '/' of Unix. The MS-DOS facilities actually *
* recognize either separator at the programmatic level but too many *
* MS-DOS programs do NOT. *
* *
************************************************************************/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int GetCurrentDirectory(int Disk, char *CurDir);
char *
RootPath (char *CurDir, char *RelPath, char *FullPath) {
char *p, *p1, *p2;
if (RelPath[0] == '\0') {
FullPath[0] = '\0';
return (NULL);
}
if (RelPath[1] == ':') { /* Path contains drive */
FullPath[0] = RelPath[0];
FullPath[1] = RelPath[1];
memmove(RelPath, RelPath + 2, strlen(RelPath) + 1);
}
else {
FullPath[0] = CurDir[0];
FullPath[1] = CurDir[1];
}
FullPath[2] = '\0';
if (strlen(RelPath) == 2 && *(RelPath + 1) == ':') strcat(RelPath, "\\");
if ((p = strchr("\\/", *RelPath)) != NULL) strcpy(FullPath + 2, RelPath);
else {
FullPath[2] = '\\';
if (FullPath[0] != CurDir[0]) {
if (GetCurrentDirectory((int) (toupper(*FullPath) - '@'), &FullPath[3]))
return (NULL);
}
else {
strcpy(FullPath, CurDir);
FullPath[strlen(FullPath) - 1] = '\0';
}
p = RelPath;
while (1) {
p1 = strchr(p, '\\');
if (!strncmp(p, "..", 2)) {
if ((p2 = strrchr(FullPath, '\\')) != NULL) *p2 = '\0';
p = p1 + 1;
}
else if (!strncmp(p, ".", 1)) {
p = p1 + 1;
break;
};
if (p1 == NULL) break;
}
if ((strlen(FullPath) > 3) || (strlen(FullPath) == 2))
strcat(FullPath, "\\");
strcat(FullPath, p);
}
while ((p = strchr(FullPath, '/')) != NULL) *p++ = '\\';
if ((strlen(FullPath) == 3) && (FullPath[2] == '\\'))
FullPath[2] = '\0';
return (strlwr(FullPath));
}